package org.pjmi.conversormonedaletra.conversor.pesos;

import java.util.ArrayList;
import org.pjmi.conversormonedaletra.beans.MonedaEntero;
import org.pjmi.conversormonedaletra.beans.MonedaFraccion;
import org.pjmi.conversormonedaletra.bo.MonedaTraductorBo;
import org.pjmi.conversormonedaletra.bo.impl.PesosTraductorBoImpl;
import org.pjmi.conversormonedaletra.commons.NombresNumerosPesos;
import org.pjmi.conversormonedaletra.conversor.Conversor;

/**
 * Clase que extiende a Conversor para poder realizar la 'escritura' de
 * cantidad expresada en pesos mexicanos a su expresion en letra
 * @author Pedro Josue Mendoza Islas
 */
public class ConversorPesos extends Conversor {
    MonedaTraductorBo pesosBo = new PesosTraductorBoImpl();
    
    @Override
    public String escritorLetra() {
        montoLetra = new StringBuilder();        
        ArrayList<MonedaEntero> pesosObj = (ArrayList<MonedaEntero>) valores.get("pesos");
        MonedaFraccion centavosObj = (MonedaFraccion) valores.get("centavos");
        int unidades = 3 - pesosObj.size();
        for(MonedaEntero monto : pesosObj) {            
            StringBuilder letrasAux = new StringBuilder();
            if (monto.getCentenas() > 0) {
                if (monto.getDecenas() > 0) {
                    if (monto.getUnidades() > 0) {
                        if (montoLetra.toString().length() > 0) {
                            montoLetra.append(NombresNumerosPesos.ESPACIO);
                        }
                        letrasAux.append(pesosBo.getNombreCentenasDencenasUnidades(monto));
                    } else {
                        if (montoLetra.toString().length() > 0) {
                            montoLetra.append(NombresNumerosPesos.ESPACIO);
                        }
                        letrasAux.append(NombresNumerosPesos.nombresCentenas().get(monto.getCentenas()))
                                .append(NombresNumerosPesos.ESPACIO)
                                .append(NombresNumerosPesos.nombresDecenas().get(monto.getDecenas()));
                    }
                } else if(monto.getDecenas() == 0
                        && monto.getUnidades() > 0){
                    if (montoLetra.toString().length() > 0) {
                            montoLetra.append(NombresNumerosPesos.ESPACIO);
                        }
                    letrasAux.append(pesosBo.getNombreCentenasUnidades(monto));
                } else {
                    if(monto.getCentenas() == 1) {
                        if (montoLetra.toString().length() > 0) {
                            montoLetra.append(NombresNumerosPesos.ESPACIO);
                        }
                        letrasAux.append(NombresNumerosPesos.CIEN);
                    } else {
                        if (montoLetra.toString().length() > 0) {
                            montoLetra.append(NombresNumerosPesos.ESPACIO);
                        }
                        letrasAux.append(NombresNumerosPesos.nombresDecenas().get(monto.getDecenas()));
                    }
                }
            } else if(monto.getDecenas() > 0 && monto.getUnidades() > 0) {
                if (montoLetra.toString().length() > 0) {
                            montoLetra.append(NombresNumerosPesos.ESPACIO);
                        }
                letrasAux.append(pesosBo.getNombreDecenasUnidades(monto));
            } else if(monto.getDecenas() > 0 && monto.getUnidades() == 0) {
                if (montoLetra.toString().length() > 0) {
                            montoLetra.append(NombresNumerosPesos.ESPACIO);
                        }
                letrasAux.append(NombresNumerosPesos.nombresDecenas().get(monto.getDecenas()));
            } else if(monto.getUnidades() > 0){
                if (montoLetra.toString().length() > 0) {
                            montoLetra.append(NombresNumerosPesos.ESPACIO);
                        }
                letrasAux.append(NombresNumerosPesos.nombresUnidades().get(monto.getUnidades()));
            }

            if(!letrasAux.toString().equals("")) {
                switch (unidades) {
                    case 0: 
                        if(letrasAux.toString().equals("UN")) {
                            letrasAux.append(NombresNumerosPesos.ESPACIO)
                                    .append(NombresNumerosPesos.MILLON);                            
                        } else {
                            letrasAux.append(NombresNumerosPesos.ESPACIO)
                                    .append(NombresNumerosPesos.MILLONES);
                        }
                        break;
                    
                    case 1:
                        letrasAux.append(NombresNumerosPesos.ESPACIO)
                                .append(NombresNumerosPesos.MIL);
                        break;
                }
            } 
            unidades++;
            montoLetra.append(letrasAux);
        }
                
        if(montoLetra.toString().equals("")) {
            montoLetra.append(NombresNumerosPesos.CERO);
        }
        if(montoLetra.toString().equals("UN")) {
            montoLetra.append(NombresNumerosPesos.ESPACIO)
                    .append(NombresNumerosPesos.PESO);
        } else {
            montoLetra.append(NombresNumerosPesos.ESPACIO)
                    .append(NombresNumerosPesos.PESOS);
        }
        
        if(montoLetra.toString().contains("MILLONES PESOS")) {
            String aux = montoLetra.toString();
            int inicio = aux.indexOf("MILLONES");
            int fin = aux.indexOf("PESOS");
            montoLetra.replace(inicio, fin, "MILLONES DE ");
        }
        
        if(montoLetra.toString().contains("MILLON PESOS")) {
            String aux = montoLetra.toString();
            int inicio = aux.indexOf("MILLON");
            int fin = aux.indexOf("PESOS");
            montoLetra.replace(inicio, fin, "MILLON DE ");
        }
        
        montoLetra.append(NombresNumerosPesos.ESPACIO);
        montoLetra.append(String.valueOf(centavosObj.getDecenas()));
        montoLetra.append(String.valueOf(centavosObj.getUnidades()));
        montoLetra.append(NombresNumerosPesos.MONEDA_NACIONAL);
        
        return montoLetra.toString();
    }

    @Override
    public String escritorMoneda() {
        throw new UnsupportedOperationException("Not supported yet.");
    }
    
}
